<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ES6中的继承</title>
</head>
<body>
<script>
    //ES6中新增了一个定义类的方法 这样就不用我们手动的创建构造函数了

    //父类
    class A{
        constructor(x) {//私有属性和方法
            this.x = x
            this.seyHello = function (){

            }
        }
        //私有的属性
        aa = 123;
        //公有方法
        getX() {
            console.log(this.x);
        }
    }
    //公有属性
    A.prototype.aa = 456;



    //子类
  /*  class B{
        constructor(y) {
            this.y = y;
            A.call(this) //Class constructor A cannot be invoked without 'new'
            //class声明的构造函数(类) 不能当作普通函数执行
        }
        getY = function () {
            console.log(this.y);
        }
    }*/
    //在使用Class构造类的时候 没办直接重定向子类原型
    // B.prototype = new A(100)



    //ES6 class继承
    //通过extends来实现继承
    //class 子类 extends 父类
    //在constructor中要使用super()
    // 特点
    //    1.父类私有的属性和方法 会变成子类私有的属性和方法
    //    2.父类公有属性和方法 会变成子类公有的属性和方法

  /*  class B extends A{// 通过extends 实现原型链继承
        constructor(y) {
            // Must call super constructor in derived class before accessing 'this' or returning from derived constructor
            super(100); // call继承(借用构造函数继承)
            this.y = y;
        }
        getY = function () {
            console.log(this.y);
        }
    }*/


    class B extends A{// 通过extends 实现原型链继承
        //如果不写constructor,不会报错 继承会正常实现
        //如果不写constructor, 浏览器会自动的帮我们去创建一些代码
        // constructor(...arg){
        //     super(...arg)
        // }


        /*constructor(y) {
            // Must call super constructor in derived class before accessing 'this' or returning from derived constructor
            super(100); // call继承(借用构造函数继承)
            this.y = y;
        }*/
        getY = function () {
            console.log(this.y);
        }
    }



    let b = new B(200);

    console.log(b)

</script>
</body>
</html>